package com.bi.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.bi.entity.DataComponent;
import com.bi.entity.DataComponentField;

import java.util.List;
import java.util.Map;

/**
 * 数据组件服务接口
 * 
 * @author BI Platform Team
 * @since 1.0.0
 */
public interface DataComponentService extends IService<DataComponent> {

    /**
     * 分页查询数据组件
     * 
     * @param current 当前页
     * @param size 页大小
     * @param params 查询参数
     * @return 分页结果
     */
    IPage<DataComponent> getComponentPage(long current, long size, Map<String, Object> params);

    /**
     * 创建数据组件
     * 
     * @param component 组件信息
     * @param fields 字段配置
     * @return 创建结果
     */
    boolean createComponent(DataComponent component, List<DataComponentField> fields);

    /**
     * 更新数据组件
     * 
     * @param component 组件信息
     * @param fields 字段配置
     * @return 更新结果
     */
    boolean updateComponent(DataComponent component, List<DataComponentField> fields);

    /**
     * 删除数据组件
     * 
     * @param id 组件ID
     * @return 删除结果
     */
    boolean deleteComponent(Long id);

    /**
     * 根据类型查询组件
     * 
     * @param type 组件类型
     * @return 组件列表
     */
    List<DataComponent> getComponentsByType(String type);

    /**
     * 获取组件统计信息
     * 
     * @return 统计信息
     */
    Map<String, Object> getStatistics();

    /**
     * 测试数据源连接
     * 
     * @param component 组件配置
     * @return 测试结果
     */
    Map<String, Object> testDataSource(DataComponent component);

    /**
     * 执行组件数据查询
     * 
     * @param componentId 组件ID
     * @param params 查询参数
     * @return 查询结果
     */
    Map<String, Object> executeQuery(Long componentId, Map<String, Object> params);

    /**
     * 预览组件数据
     * 
     * @param component 组件配置
     * @param fields 字段配置
     * @param params 查询参数
     * @return 预览数据
     */
    Map<String, Object> previewData(DataComponent component, List<DataComponentField> fields, Map<String, Object> params);

    /**
     * 刷新组件缓存
     * 
     * @param componentId 组件ID
     * @return 刷新结果
     */
    boolean refreshCache(Long componentId);

    /**
     * 复制组件
     * 
     * @param componentId 原组件ID
     * @param newName 新组件名称
     * @return 复制结果
     */
    DataComponent copyComponent(Long componentId, String newName);
}